<?php

/**
 * nodo actions.
 *
 * @package    hipermedio
 * @subpackage nodo
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class nodoActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
    $this->nodos = Doctrine_Core::getTable('Nodo')
      ->createQuery('a')
      ->execute();
  }

  public function executeShow(sfWebRequest $request)
  {
    $this->nodo = Doctrine_Core::getTable('Nodo')->find(array($request->getParameter('id')));
    $this->forward404Unless($this->nodo);
  }

  public function executeNew(sfWebRequest $request)
  {
    $this->form = new NodoForm();
    $this->hipermedio = Doctrine::getTable('Hipermedio')->find(array($request->getParameter('hipermedio_id')));
    $this->forward404Unless($this->hipermedio);
    
    $ensayo = Doctrine::getTable('Ensayo')->findOneByHipermedioId(array($this->hipermedio->getId()));
    $this->palabras_claves = $ensayo->getPalabrasClave();
    
    $ws = $this->form->getWidgetSchema();
    $ws['hipermedio_id']->setAttribute("value", $this->hipermedio->getId());
    $ws['nombre']->setHidden(true);
    $ws['nombre']->setAttribute('type', 'hidden');
    $ws['nombre']->setAttribute('value', $request->getParameter('texto'));
    
    return $this->renderPartial('new', array('form' => $this->form, 'palabras_claves' => $this->palabras_claves));
  }

  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));

    $this->form = new NodoForm();

    $nodo = $this->processForm($request, $this->form);

    if($nodo){
        
        // Saacamos la palabra clave del listado
        $palabra_clave = new Tag();
        $palabra_clave = Doctrine::getTable('Tag')->findOneById($nodo->getTagId());
        $palabra_clave->setSeleccionado(true);
        $palabra_clave->save();
        
        // Retornamos el nodo
        return $this->renderPartial('nodo', array('nodo' => $nodo));
    }
    else{
        $this->setTemplate('edit');
    }
  }

  public function executeEdit(sfWebRequest $request)
  {
    $this->forward404Unless($nodo = Doctrine_Core::getTable('Nodo')->find(array($request->getParameter('id'))), sprintf('Object nodo does not exist (%s).', $request->getParameter('id')));
    $this->form = new NodoForm($nodo);
    
  }

  public function executeUpdate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($nodo = Doctrine_Core::getTable('Nodo')->find(array($request->getParameter('id'))), sprintf('Object nodo does not exist (%s).', $request->getParameter('id')));
    $this->form = new NodoForm($nodo);

    $nodo = $this->processForm($request, $this->form);

    if($nodo){
        return $this->renderPartial('nodo', array('nodo' => $nodo));
    }
    else{
        $this->setTemplate('edit');
    }
  }

  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($nodo = Doctrine_Core::getTable('Nodo')->find(array($request->getParameter('id'))), sprintf('Object nodo does not exist (%s).', $request->getParameter('id')));
    $nodo->delete();

    $this->redirect('nodo/index');
  }
  
  public function executeBorrarNodo(sfWebRequest $request)
  {
    $codigo = $request->getParameter('id');
    $this->forward404Unless($nodo = Doctrine_Core::getTable('Nodo')->findOneByUuid($codigo), sprintf('Object nodo does not exist (%s).', $codigo));
    $tag_id = $nodo->getTagId();
    $nodo->delete();

    // Restablecemos el tag
    $this->forward404Unless($tag = Doctrine_Core::getTable('Tag')->findOneById($tag_id), sprintf('Object Tag does not exist (%s).', $tag_id));
    $tag->setSeleccionado(0);
    $tag->save();

    return $this->renderText('Success');
  }

  public function executeMoverNodo(sfWebRequest $request)
  {
    $codigo = $request->getParameter('id');
    $x = $request->getParameter('x');
    $y = $request->getParameter('y');
    
    $this->forward404Unless($nodo = Doctrine_Core::getTable('Nodo')->findOneByUuid($codigo), sprintf('Object nodo does not exist (%s).', $codigo));
    
    $nodo->setPosicionX($x);
    $nodo->setPosicionY($y);
    $nodo->save();

    return $this->renderText('Success');
  }
  
  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $nodo = $form->save();
      
      return $nodo;
    }
  }
  
  public function executeCrearMedio(sfWebRequest $request){
      $nodo_id = $request->getParameter('nodo_id');
      $tipo_medio = $request->getParameter('tipo_medio');
      
      $this->nodo = Doctrine::getTable('Nodo')->findOneById($nodo_id);
      
      if($this->nodo){
          $link = 'medio_'.$tipo_medio.'/new?id='.$nodo_id;
          
          if($tipo_medio == 'texto'){
              $this->medio = new MedioTextoForm();
          }
          elseif($tipo_medio == 'video'){
              $this->medio = new MedioVideoForm();
          }
          elseif($tipo_medio == 'imagen'){
              $this->medio = new MedioImagenForm();
          }
          elseif($tipo_medio == 'url'){
              $this->medio = new MedioURLForm();
          }
          else{
              $this->medio = new MedioSonidoForm();
          }
          
          $ws = $this->medio->getWidgetSchema();
          $ws['nodo_id']->setAttribute('value', $nodo_id);
          
          return $this->renderPartial('medio_'.$tipo_medio.'/form', array('form' => $this->medio, 'nodo' => $this->nodo));
      }
      else{
          return $this->renderText('Error');
      }
      
      
  }
  
  public function executeEditarMedio(sfWebRequest $request){
      $nodo_id = $request->getParameter('nodo_id');
      
      // Obtenemos el nodo
      $this->nodo = new Nodo();
      $this->nodo = Doctrine::getTable('Nodo')->findOneById($nodo_id);
      
      // Si existe
      if($this->nodo){
          
          $tipo_medio = $this->nodo->getTipoMedio();
          
          if($tipo_medio == 'texto'){
              $medio = Doctrine::getTable('MedioTexto')->findOneByNodoId($nodo_id);
              $this->medio = new MedioTextoForm($medio);
          }
          elseif($tipo_medio == 'video'){
              $medio = Doctrine::getTable('MedioVideo')->findOneByNodoId($nodo_id);
              $this->medio = new MedioVideoForm($medio);
          }
          elseif($tipo_medio == 'imagen'){
              $medio = Doctrine::getTable('MedioImagen')->findOneByNodoId($nodo_id);
              $this->medio = new MedioImagenForm($medio);
          }
          elseif($tipo_medio == 'url'){
              $medio = Doctrine::getTable('MedioURL')->findOneByNodoId($nodo_id);
              $this->medio = new MedioURLForm($medio);
          }
          else{
              $medio = Doctrine::getTable('MedioSonido')->findOneByNodoId($nodo_id);
              $this->medio = new MedioSonidoForm($medio);
          }
          
//          $ws = $this->medio->getWidgetSchema();
//          $ws['nodo_id']->setAttribute('value', $nodo_id);
          
          return $this->renderPartial('medio_'.$tipo_medio.'/form', array('form' => $this->medio, 'nodo' => $this->nodo));
      }
      else{
          return $this->renderText('Error');
      }
  }
  
  
  public function executeCargarMedio(sfWebRequest $request){
      $nodo_id = $request->getParameter('nodo_id');
      
      $this->nodo = new Nodo();
      $this->nodo = Doctrine::getTable('Nodo')->findOneById($nodo_id);
      $tipo_medio = $this->nodo->getTipoMedio();
      
      if($this->nodo){
          
          if($tipo_medio == 'texto'){
              $this->medio = Doctrine::getTable('MedioTexto')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'video'){
              $this->medio = Doctrine::getTable('MedioVideo')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'imagen'){
              $this->medio = Doctrine::getTable('MedioImagen')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'url'){
              $this->medio = Doctrine::getTable('MedioURL')->findOneByNodoId($nodo_id);
          }
          else{
              $this->medio = Doctrine::getTable('MedioSonido')->findOneByNodoId($nodo_id);
          }
          
          return $this->renderPartial('medio_'.$tipo_medio.'/show', array('medio' => $this->medio));
      }
      else{
          return $this->renderText('Error');
      }
      
  }
  
  public function executeEditarNodo(sfWebRequest $request)
  {
    $this->forward404Unless($nodo = Doctrine_Core::getTable('Nodo')->find(array($request->getParameter('nodo_id'))), sprintf('Object nodo does not exist (%s).', $request->getParameter('nodo_id')));
    $this->form = new NodoForm($nodo);
    
    $this->poseeMedio = false;
    if($nodo->getTipoMedio() != null){
        $this->poseeMedio = true;
    }
    
    return $this->renderPartial('form', array('form' => $this->form, 'poseeMedio' => $this->poseeMedio, 'nodo' => $nodo));
    
  }
  
  public function executeCargarNodo(sfWebRequest $request){
      
      // Obtenemos los ID's
      $nodo_id = $request->getParameter('nodo_id');
      $nodo_padre_id = $request->getParameter('nodo_padre_id');
      $nodo_x = $request->getParameter('nodo_x');
      $nodo_y = $request->getParameter('nodo_y');
      $edicion = $request->getParameter('edicion');
      $hipermedio_id = $request->getParameter('hipermedio_id');
      
      $this->nodo = Doctrine_Core::getTable('Nodo')->findOneByUuid(array($nodo_id));
      
      // Si el nodo corresponde
      if($this->nodo){
        return $this->renderPartial('nodo', array('nodo' => $this->nodo, 'edicion' => $edicion));
      }
      
      // Si no, creamos un no nuevo
      else{
        $this->form = new NodoForm();
        $this->hipermedio = Doctrine::getTable('Hipermedio')->find(array($hipermedio_id));
        $this->forward404Unless($this->hipermedio);
        
        $ensayo = Doctrine::getTable('Ensayo')->findOneByHipermedioId(array($this->hipermedio->getId()));
        
        if($ensayo){
            $this->palabras_claves = $ensayo->getPalabrasClave();
        
            $ws = $this->form->getWidgetSchema();
            $ws['uuid']->setAttribute('value', $nodo_id);
            $ws['posicion_x']->setAttribute('value', $nodo_x);
            $ws['posicion_y']->setAttribute('value', $nodo_y);
            $ws['hipermedio_id']->setAttribute('value', $this->hipermedio->getId());
            $ws['nombre']->setHidden(true);
            $ws['nombre']->setAttribute('type', 'hidden');
            $ws['nombre']->setAttribute('value', $request->getParameter('texto'));
        }
        else{
            return $this->renderText('No existe o no fue subido el ensayo para este hipermedio. Pruebe creando un nuevo proyecto');
        }
        
        // Si tiene un padre, vemos quien es
        if($nodo_padre_id != 'null'){
            $nodo_padre = Doctrine::getTable('Nodo')->findOneByUuid($nodo_padre_id);
            $ws['nodo_padre_id']->setAttribute('value', $nodo_padre->getId());
        }

        return $this->renderPartial('new', array('form' => $this->form, 'palabras_claves' => $this->palabras_claves, 'nodo_id' => $nodo_id));
      }
      
  }
  
  public function executeDisociarNodo(sfWebRequest $request){
      
      // Obtenemos los ID's
      $nodo_id = $request->getParameter('nodo_id');
      
      // Actualizamos en nodo
      $this->nodo = new Nodo();
      $this->nodo = Doctrine::getTable('Nodo')->findOneById($nodo_id);
      $tipo_medio = $this->nodo->getTipoMedio();
      $this->nodo->setTipoMedio(null);
      $this->nodo->save();
      
      // Borramos el medio
      if($this->nodo){   
          if($tipo_medio == 'texto'){
              $this->medio = Doctrine::getTable('MedioTexto')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'video'){
              $this->medio = Doctrine::getTable('MedioVideo')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'imagen'){
              $this->medio = Doctrine::getTable('MedioImagen')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'url'){
              $this->medio = Doctrine::getTable('MedioURL')->findOneByNodoId($nodo_id);
          }
          else{
              $this->medio = Doctrine::getTable('MedioSonido')->findOneByNodoId($nodo_id);
          }
          
          $this->medio->delete();
          return $this->renderPartial('nodo', array('nodo' => $this->nodo, 'edicion' => true));
      }
      else{
          return $this->renderText('Error');
      }
  }
  
  public function executeCargarMiniMedio($request) {
      $nodo_uuid = $request->getParameter('nodo_uuid');
      
      $this->nodo = new Nodo();
      $this->nodo = Doctrine::getTable('Nodo')->findOneByUuid($nodo_uuid);
      $nodo_id = $this->nodo->getId();
      $tipo_medio = $this->nodo->getTipoMedio();
      
      if($this->nodo && $tipo_medio != ''){
          
          if($tipo_medio == 'texto'){
              $this->medio = Doctrine::getTable('MedioTexto')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'video'){
              $this->medio = Doctrine::getTable('MedioVideo')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'imagen'){
              $this->medio = Doctrine::getTable('MedioImagen')->findOneByNodoId($nodo_id);
          }
          elseif($tipo_medio == 'url'){
              $this->medio = Doctrine::getTable('MedioURL')->findOneByNodoId($nodo_id);
          }
          else{
              $this->medio = Doctrine::getTable('MedioSonido')->findOneByNodoId($nodo_id);
          }
          
          return $this->renderPartial('medio_'.$tipo_medio.'/showMini', array('medio' => $this->medio));
      }
      elseif($tipo_medio == ''){
          return $this->renderText('');
      }
      else{
          return $this->renderText('Error');
      }
  }
}
